package cn.iocoder.yudao.module.diy.service.config;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.diy.pojo.LoginConfigVo;
import cn.iocoder.yudao.module.diy.pojo.SysConfigMapParam;
import cn.iocoder.yudao.module.diy.pojo.SysMapVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.module.diy.controller.admin.config.vo.*;
import cn.iocoder.yudao.module.diy.dal.dataobject.config.DiyConfigDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.diy.dal.mysql.config.DiyConfigMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.diy.enums.ErrorCodeConstants.*;

/**
 * 装修配置 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class DiyConfigServiceImpl implements DiyConfigService {

    @Resource
    private DiyConfigMapper diyConfigMapper;

    @Override
    public Long createConfig(ConfigSaveReqVO createReqVO) {
        // 插入
        DiyConfigDO config = BeanUtils.toBean(createReqVO, DiyConfigDO.class);
        diyConfigMapper.insert(config);
        // 返回
        return config.getId();
    }

    @Override
    public void updateConfig(ConfigSaveReqVO updateReqVO) {
        // 校验存在
        validateConfigExists(updateReqVO.getId());
        // 更新
        DiyConfigDO updateObj = BeanUtils.toBean(updateReqVO, DiyConfigDO.class);
        diyConfigMapper.updateById(updateObj);
    }

    @Override
    public void deleteConfig(Long id) {
        // 校验存在
        validateConfigExists(id);
        // 删除
        diyConfigMapper.deleteById(id);
    }

    private void validateConfigExists(Long id) {
        if (diyConfigMapper.selectById(id) == null) {
            throw exception(CONFIG_NOT_EXISTS);
        }
    }

    @Override
    public DiyConfigDO getConfig(Long id) {
        return diyConfigMapper.selectById(id);
    }

    @Override
    public PageResult<DiyConfigDO> getConfigPage(ConfigPageReqVO pageReqVO) {
        return diyConfigMapper.selectPage(pageReqVO);
    }

    @Override
    public DiyConfigDO getConfig(Long tenantId, String key) {
        DiyConfigDO model = diyConfigMapper.selectOne(new QueryWrapper<DiyConfigDO>().eq("config_key", key).eq("site_id", tenantId).last(" limit 1"));
        return model;
    }

    @Override
    public JSONArray getConfigArrayValue(String key) {
        DiyConfigDO model = diyConfigMapper.selectOne(new QueryWrapper<DiyConfigDO>().eq("config_key", key).last(" limit 1"));
        if (ObjectUtil.isNotNull(model)) {
            if (!model.getConfigValue().equals("")) {
                return model.getArrayValue();
            }else{
                return new JSONArray();
            }
        }else{
            return new JSONArray();
        }
    }
    @Override
    public JSONObject getConfigValue(String key) {
        DiyConfigDO model = diyConfigMapper.selectOne(new QueryWrapper<DiyConfigDO>().eq("config_key", key).last(" limit 1"));
        Object jsonObject = null;
        if (ObjectUtil.isNotNull(model)) {
            if (!model.getConfigValue().equals("")) {
                jsonObject= model.getConfigValue();
            }else{
                jsonObject= "";
            }
        }
        if(ObjectUtil.isNotEmpty(jsonObject)){
            return JSONUtil.parseObj(jsonObject);
        }else{
            return new JSONObject();
        }
    }

    @Override
    public void setConfig(Long tenantId,Long addonId,Long siteId,String key, JSON valueJson) {
        if(tenantId==null){
            tenantId=TenantContextHolder.getTenantId();
        }
        DiyConfigDO model = diyConfigMapper.selectOne(
                new QueryWrapper<DiyConfigDO>()
                        .eq("config_key", key)
                        .eq("tenant_id", tenantId)
                        .eq("site_id", siteId)
                        .last("limit 1"));
        if (ObjectUtil.isNull(model)) {
            DiyConfigDO addModel = new DiyConfigDO();
            //添加数据
            addModel.setConfigKey(key);
            addModel.setConfigStatus(1);
            addModel.setConfigValue(valueJson.toString());
            addModel.setTenantId(tenantId);
            addModel.setAddonId(addonId);
            addModel.setSiteId(siteId);
            diyConfigMapper.insert(addModel);
        } else {
            model.setConfigValue(valueJson.toString());
            model.setAddonId(addonId);
            model.setSiteId(siteId);
            diyConfigMapper.update(model, new QueryWrapper<DiyConfigDO>().eq("config_key", key));
        }
    }

    @Override
    public SysMapVo map(SysConfigMapParam param) {
        JSONObject config =getConfigValue("MAPKEY");
        return JSONUtil.toBean(config, SysMapVo.class);
    }

    @Override
    public LoginConfigVo getLoginConfig(Long tenantId) {
        JSONObject config =getConfigValue("LOGIN");
        return JSONUtil.toBean(config, LoginConfigVo.class);
    }


}